package com.tankbattle.model;

import java.awt.Graphics2D;
import java.awt.Rectangle;

/**
 * 所有游戏对象的抽象基类
 */
public abstract class GameObject {
    protected int x, y;          // 位置坐标 (左上角)
    protected int width, height; // 尺寸
    protected boolean active;    // 对象是否活跃/可见

    public GameObject(int x, int y, int width, int height) {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
        this.active = true; // 默认是活跃的
    }

    /**
     * 更新对象状态的抽象方法
     * 子类需要实现具体的更新逻辑
     * @param delta 时间增量（用于实现与帧率无关的移动）
     */
    public abstract void update(double delta);

    /**
     * 绘制对象自身的抽象方法
     * 子类需要实现具体的绘制逻辑
     * @param g Graphics2D绘图上下文
     */
    public abstract void draw(Graphics2D g);

    /**
     * 获取对象的边界矩形，用于碰撞检测
     * @return 代表对象边界的Rectangle对象
     */
    public Rectangle getBounds() {
        return new Rectangle(x, y, width, height);
    }

    /**
     * 检测当前对象是否与另一个GameObject发生碰撞
     * @param other 另一个GameObject
     * @return 如果发生碰撞，返回true；否则返回false
     */
    public boolean intersects(GameObject other) {
        if (other == null || !this.active || !other.active) {
            return false; // 不与null或非活跃对象碰撞
        }
        return this.getBounds().intersects(other.getBounds());
    }

    // Getter 和 Setter
    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    public int getWidth() {
        return width;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public boolean isActive() {
        return active;
    }

    public void setActive(boolean active) {
        this.active = active;
    }
}
